package my.ldap;

import javax.naming.Binding;
import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
import java.util.Hashtable;

/**
 * Java实现对Ldap的增删改查
 */
public class LdapJNDI {
    public void JNDILookup() {
        String filter = "(objectClass=posixAccount)";
        String username = "cn=admin,dc=huada,dc=pcm";// xxx为申请的对接账户
        String password = "admin";

        Hashtable<String,Object> env = new Hashtable<>();
        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");// 设置连接LDAP的实现工厂
        env.put(Context.PROVIDER_URL, "ldap://39.106.152.6:389/");                   // 指定LDAP服务器的主机名和端口号
        env.put(Context.SECURITY_AUTHENTICATION, "simple");                          // 给环境提供认证方法,有SIMPLE、SSL/TLS和SASL
        env.put(Context.SECURITY_PRINCIPAL, username);                               // 指定进入的目录识别名DN
        env.put(Context.SECURITY_CREDENTIALS, password);                             // 进入的目录密码
        env.put("filter", filter);                                                   // 过滤条件?
        DirContext ctx = null;
        try {
            // 得到初始目录环境的一个引用
            ctx = new InitialDirContext(env);
            Attributes attrs = ctx.getAttributes("cn=shga0.shga0,ou=shgou1,dc=huada,dc=pcm");// 获取到一个人员

            // NamingEnumeration<NameClassPair> bindings = ctx.list("ou=shgou1,dc=huada,dc=pcm");
            NamingEnumeration bindings = ctx.listBindings("dc=huada,dc=pcm");// 列举 内部人员
            while (bindings.hasMore()) {
                Binding bd = (Binding) bindings.next();
                System.out.println(bd.getName() + "--->" + bd.getClassName() + "--->" + bd.getNameInNamespace() + "--->" + bd.getClass() + "--->" + bd.getObject());
            }
            /*根据结点的DN来查找它的所有属性, 然后再从属性中得到所有的值,注意一个属性可以有多个值*/
            for (NamingEnumeration ae = attrs.getAll(); ae.hasMore(); ) {
                // 获取一个属性
                Attribute attr = (Attribute) ae.next();
                for (NamingEnumeration ve = attr.getAll(); ve.hasMore(); ) {
                    System.out.println(String.format("Attribute=%s,Value=%s", attr.getID(), ve.next()));
                }
            }

        } catch (javax.naming.AuthenticationException e) {
            System.out.println("认证失败");
            e.printStackTrace();
        } catch (Exception e) {
            System.out.println("认证出错：");
            e.printStackTrace();
        } finally {
            if (ctx != null) {
                try {
                    ctx.close();
                } catch (NamingException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void main(String[] args) {
        LdapJNDI ldapJNDI = new LdapJNDI();
        ldapJNDI.JNDILookup();

    }
}

